home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivodbcdic.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  12.2 KB  |  417 lines

  1. unit IvODBCDic;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes,
  7.   IvDictio, IvDatDic, IvConnection;
  8.  
  9. type
  10.   TIvODBCDictionary = class(TIvCustomDatabaseDictionary)
  11.   private
  12.     FConnection: TIvConnection;
  13.  
  14.     function GetDataSource: String;
  15.     procedure SetDataSource(const value: String);
  16.  
  17.     function GetUserName: String;
  18.     procedure SetUserName(const value: String);
  19.  
  20.     function GetPassword: String;
  21.     procedure SetPassword(const value: String);
  22.  
  23.   protected
  24.     function GetLanguageCount: Integer; override;
  25.     procedure GetLanguageData(i: Integer; language: TIvLanguage); override;
  26.     function GetLocaleCount: Integer; override;
  27.     procedure GetLocaleData(index: Integer; locale: TIvLocale); override;
  28.  
  29.   public
  30.     constructor Create(owner: TComponent); override;
  31.     destructor Destroy; override;
  32.  
  33.     procedure Open; override;
  34.     procedure Close; override;
  35.  
  36.     function TranslateString(
  37.       const str: String;
  38.       var translation: String): Boolean; override;
  39.     function TranslateContextString(
  40.       const str, form, component: String;
  41.       var translation: String): Boolean; override;
  42.  
  43.     procedure GetLanguageDatas(list: TList); override;
  44.  
  45.     class function SQLStr(const value: String): String;
  46.     class function GetResultsetCount(resultset: TIvResultset): Integer;
  47.  
  48.     class function LanguageFromResultSet(language: TIvLanguage; resultSet: TIvResultSet): Boolean;
  49.     class function LocaleFromResultSet(locale: TIvLocale; resultSet: TIvResultSet): Boolean;
  50.  
  51.     class function GetContextType(
  52.       resultSet: TIvResultSet;
  53.       languageCount: Integer): TIvContextType;
  54.  
  55.     property Connection: TIvConnection read FConnection;
  56.  
  57.   published
  58.     property DataSource: String read GetDataSource write SetDataSource;
  59.     property UserName: String read GetUserName write SetUserName;
  60.     property Password: String read GetPassword write SetPassword;
  61.   end;
  62.  
  63. implementation
  64.  
  65. uses
  66.   SysUtils;
  67.  
  68. constructor TIvODBCDictionary.Create(owner: TComponent);
  69. begin
  70.   inherited Create(owner);
  71.   FConnection := TIvConnection.Create;
  72. end;
  73.  
  74. destructor TIvODBCDictionary.Destroy;
  75. begin
  76.   FConnection.Free;
  77.   inherited Destroy;
  78. end;
  79.  
  80. class function TIvODBCDictionary.GetContextType(
  81.   resultSet: TIvResultSet;
  82.   languageCount: Integer): TIvContextType;
  83. begin
  84.   if resultSet.ColumnCount = languageCount + 1 then
  85.     Result := [ivctForm]
  86.   else if resultSet.ColumnCount > languageCount + 1 then
  87.     Result := [ivctForm, ivctComponent]
  88.   else
  89.     Result := [];
  90. end;
  91.  
  92. function TIvODBCDictionary.GetDataSource: String;
  93. begin
  94.   Result := FConnection.DataSource;
  95. end;
  96.  
  97. procedure TIvODBCDictionary.SetDataSource(const value: String);
  98. begin
  99.   FConnection.DataSource := value;
  100. end;
  101.  
  102. function TIvODBCDictionary.GetUserName: String;
  103. begin
  104.   Result := FConnection.UserName;
  105. end;
  106.  
  107. procedure TIvODBCDictionary.SetUserName(const value: String);
  108. begin
  109.   FConnection.UserName := value;
  110. end;
  111.  
  112. function TIvODBCDictionary.GetPassword: String;
  113. begin
  114.   Result := FConnection.Password;
  115. end;
  116.  
  117. procedure TIvODBCDictionary.SetPassword(const value: String);
  118. begin
  119.   FConnection.Password := value;
  120. end;
  121.  
  122. procedure TIvODBCDictionary.Open;
  123. var
  124.   resultSet: TIvResultset;
  125. begin
  126.   if IsOpen then
  127.     Exit;
  128.  
  129.   FConnection.Open;
  130.  
  131.   resultSet := FConnection.CreateResultSet;
  132.   try
  133.     resultSet.ExecuteDirect('SELECT * FROM ' + TableName);
  134.     resultSet.Next;
  135.     FContextType := GetContextType(resultSet, LanguageCount);
  136.   finally
  137.     resultSet.Free;
  138.   end;
  139.  
  140.   inherited Open;
  141. end;
  142.  
  143. procedure TIvODBCDictionary.Close;
  144. begin
  145.   if FConnection <> nil then
  146.     FConnection.Close;
  147.   inherited Close;
  148. end;
  149.  
  150. function TIvODBCDictionary.GetLanguageCount: Integer;
  151. var
  152.   resultSet: TIvResultset;
  153. begin
  154.   Result := 0;
  155.   resultSet := FConnection.CreateResultSet;
  156.   try
  157.     resultSet.ExecuteDirect('SELECT * FROM ' + LanguageTableName);
  158.     while resultSet.Next do
  159.       Inc(Result);
  160.   finally
  161.     resultSet.Free;
  162.   end;
  163. end;
  164.  
  165. procedure TIvODBCDictionary.GetLanguageData(i: Integer; language: TIvLanguage);
  166. var
  167.   j: Integer;
  168.   resultSet: TIvResultset;
  169. begin
  170.   resultSet := FConnection.CreateResultSet;
  171.   try
  172.     resultSet.ExecuteDirect('SELECT * FROM ' + LanguageTableName);
  173.     for j := 0 to i do
  174.       resultSet.Next;
  175.     LanguageFromResultset(language, resultSet);
  176.   finally
  177.     resultSet.Free;
  178.   end;
  179. end;
  180.  
  181. procedure TIvODBCDictionary.GetLanguageDatas(list: TList);
  182. var
  183.   resultSet: TIvResultset;
  184.   language: TIvLanguage;
  185. begin
  186.   resultSet := FConnection.CreateResultSet;
  187.   try
  188.     resultSet.ExecuteDirect('SELECT * FROM ' + LanguageTableName);
  189.     while resultSet.Next do
  190.     begin
  191.       language := TIvLanguage.Create;
  192.       LanguageFromResultset(language, resultSet);
  193.       list.Add(language);
  194.     end;
  195.   finally
  196.     resultSet.Free;
  197.   end;
  198. end;
  199.  
  200. function TIvODBCDictionary.GetLocaleCount: Integer;
  201. var
  202.   resultSet: TIvResultset;
  203. begin
  204.   Result := 0;
  205.   resultSet := FConnection.CreateResultSet;
  206.   try
  207.     resultSet.ExecuteDirect('SELECT * FROM ' + LocaleTableName);
  208.     while resultSet.Next do
  209.       Inc(Result);
  210.   finally
  211.     resultSet.Free;
  212.   end;
  213. end;
  214.  
  215. procedure TIvODBCDictionary.GetLocaleData(index: Integer; locale: TIvLocale);
  216. var
  217.   i: Integer;
  218.   resultSet: TIvResultset;
  219. begin
  220.   resultSet := FConnection.CreateResultSet;
  221.   try
  222.     resultSet.ExecuteDirect('SELECT * FROM ' + LocaleTableName);
  223.     for i := 0 to index do
  224.       resultSet.Next;
  225.     LocaleFromResultset(locale, resultSet);
  226.   finally
  227.     resultSet.Free;
  228.   end;
  229. end;
  230.  
  231. function TIvODBCDictionary.TranslateString(
  232.   const str: String;
  233.   var translation: String): Boolean;
  234. var
  235.   statement: String;
  236.   resultset: TIvResultset;
  237. begin
  238.   resultset := FConnection.CreateResultSet;
  239.   try
  240.     statement := 'SELECT * FROM ' + TableName + ' WHERE Native = ''' + SQLStr(str) + '''';
  241.     resultset.ExecuteDirect(statement);
  242.     Result := resultset.Next;
  243.     if Result then
  244.       translation := resultSet.Columns[GetFieldIndex].AsString;
  245.   finally
  246.     resultset.Free;
  247.   end;
  248. end;
  249.  
  250. function TIvODBCDictionary.TranslateContextString(
  251.   const str, form, component: String;
  252.   var translation: String): Boolean;
  253. var
  254.   statement: String;
  255.   resultset: TIvResultset;
  256. begin
  257.   if ContextType = [] then
  258.     Result := TranslateString(str, translation)
  259.   else
  260.   begin
  261.     resultset := FConnection.CreateResultSet;
  262.     try
  263.       statement := 'SELECT * FROM ' + TableName +
  264.         ' WHERE Native = ''' + SQLStr(str) + '''' +
  265.         ' AND Form = ''' + form + ''' AND Component = ''' + component + '''';
  266.       resultset.ExecuteDirect(statement);
  267.       Result := resultset.Next;
  268.       if Result then
  269.         translation := resultSet.Columns[GetFieldIndex].AsString;
  270.     finally
  271.       resultset.Free;
  272.     end;
  273.   end;
  274. end;
  275.  
  276. class function TIvODBCDictionary.SQLStr(const value: String): String;
  277. var
  278.   i: Integer;
  279. begin
  280.   if Pos('''', value) = 0 then
  281.     Result := value
  282.   else
  283.   begin
  284.     Result := '';
  285.     for i := 1 to Length(value) do
  286.     begin
  287.       Result := Result + value[i];
  288.       if value[i] = '''' then
  289.         Result := Result + '''';
  290.     end;    
  291.   end;
  292. end;
  293.  
  294. class function TIvODBCDictionary.GetResultsetCount(resultset: TIvResultset): Integer;
  295. begin
  296.   Result := 0;
  297.   while resultset.Next do
  298.     Inc(Result);
  299. end;
  300.  
  301. class function TIvODBCDictionary.LanguageFromResultSet(
  302.   language: TIvLanguage;
  303.   resultSet: TIvResultSet): Boolean;
  304. begin
  305.   Result := False;
  306.  
  307.   language.EnglishName := resultSet.Columns[LANGUAGE_ENGLISH_NAME_C].AsString;
  308.   language.NativeName := resultSet.Columns[LANGUAGE_NATIVE_NAME_C].AsString;
  309.  
  310.   language.Primary := resultSet.Columns[LANGUAGE_PRIMARY_C].AsInteger;
  311.   language.AllSubs := resultSet.Columns[LANGUAGE_SUBS_C].AsString;
  312.   language.DefaultSub := resultSet.Columns[LANGUAGE_DEFAULT_SUB_C].AsInteger;
  313.  
  314.   if resultSet.ColumnCount > LANGUAGE_CHARSET_C then
  315.     language.Charset := resultSet.Columns[LANGUAGE_CHARSET_C].AsInteger
  316.   else
  317.   begin
  318.     language.Charset := 0;
  319.     Result := True;
  320.   end;
  321.   language.CodePage := resultSet.Columns[LANGUAGE_CODE_PAGE_C].AsInteger;
  322.  
  323.   language.ISOLanguage := resultSet.Columns[LANGUAGE_ISO_LANGUAGE_C].AsString;
  324.   language.ISOAllCountries := resultSet.Columns[LANGUAGE_ISO_COUNTRIES_C].AsString;
  325.   language.ISODefaultCountry := resultSet.Columns[LANGUAGE_ISO_DEFAULT_COUNTRY_C].AsString;
  326.  
  327.   language.FontName := resultSet.Columns[LANGUAGE_FONT_NAME_C].AsString;
  328.   language.FontSize := resultSet.Columns[LANGUAGE_FONT_SIZE_C].AsInteger;
  329.  
  330.   language.OptionsAsInt := resultSet.Columns[LANGUAGE_OPTIONS_C].AsInteger;
  331.  
  332.   language.Init;
  333. end;
  334.  
  335. class function TIvODBCDictionary.LocaleFromResultSet(
  336.   locale: TIvLocale;
  337.   resultSet: TIvResultSet): Boolean;
  338. var
  339.   i: Integer;
  340.  
  341.   function GetChar(index: Integer): Char;
  342.   var
  343.     str: String;
  344.   begin
  345.     str := resultSet.Columns[index].AsString;
  346.     if str = '' then
  347.       Result := ' '
  348.     else
  349.       Result := str[1];
  350.   end;
  351.  
  352. begin
  353.   Result := False;
  354.  
  355.   locale.Primary := resultSet.Columns[LOCALE_PRIMARY_C].AsInteger;
  356.   locale.Sub := resultSet.Columns[LOCALE_SUB_C].AsInteger;
  357.   if resultSet.ColumnCount > LOCALE_CHARSET_C then
  358.     locale.Charset := resultSet.Columns[LOCALE_CHARSET_C].AsInteger
  359.   else
  360.   begin
  361.     locale.Charset := 0;
  362.     Result := True;
  363.   end;
  364.   locale.CodePage := resultSet.Columns[LOCALE_CODEPAGE_C].AsInteger;
  365.   locale.ISOLanguage := resultSet.Columns[LOCALE_ISO_LANGUAGE_C].AsString;
  366.   locale.ISOCountry := resultSet.Columns[LOCALE_ISO_COUNTRY_C].AsString;
  367.   locale.IsCustom := resultSet.Columns[LOCALE_IS_CUSTOM_C].AsInteger = 1;
  368.  
  369.   locale.EnglishLanguageName := resultSet.Columns[LOCALE_ENGLISH_LANGUAGE_NAME_C].AsString;
  370.   locale.EnglishCountryName := resultSet.Columns[LOCALE_ENGLISH_COUNTRY_NAME_C].AsString;
  371.   locale.NativeLanguageName := resultSet.Columns[LOCALE_NATIVE_LANGUAGE_NAME_C].AsString;
  372.   locale.NativeCountryName := resultSet.Columns[LOCALE_NATIVE_COUNTRY_NAME_C].AsString;
  373.   locale.Win16LanguageName := resultSet.Columns[LOCALE_WIN16_LANGUAGE_NAME_C].AsString;
  374.   locale.Win16CountryName := resultSet.Columns[LOCALE_WIN16_COUNTRY_NAME_C].AsString;
  375.  
  376.   locale.MeasurementSystem := TIvMeasurementSystem(resultSet.Columns[LOCALE_MEASUREMENT_SYSTEM_C].AsInteger);
  377.   locale.CurrencyString := resultSet.Columns[LOCALE_CURRENCY_STRING_C].AsString;
  378.   locale.CurrencyFormat := TIvCurrencyFormat(resultSet.Columns[LOCALE_CURRENCY_FORMAT_C].AsInteger);
  379.   locale.NegCurrFormat := TIvNegativeCurrencyFormat(resultSet.Columns[LOCALE_NEG_CURR_FORMAT_C].AsInteger);
  380.   locale.ThousandSeparator := GetChar(LOCALE_THOUSAND_SEPARATOR_C);
  381.   locale.DecimalSeparator := GetChar(LOCALE_DECIMAL_SEPARATOR_C);
  382.   locale.CurrencyDecimals := resultSet.Columns[LOCALE_CURRENCY_DECIMALS_C].AsInteger;
  383.  
  384.   locale.DateSeparator := GetChar(LOCALE_DATE_SEPARATOR_C);
  385.   locale.ShortDateFormat := resultSet.Columns[LOCALE_SHORT_DATE_FORMAT_C].AsString;
  386.   locale.LongDateFormat := resultSet.Columns[LOCALE_LONG_DATE_FORMAT_C].AsString;
  387.  
  388.   locale.TimeSeparator := GetChar(LOCALE_TIME_SEPARATOR_C);
  389.   locale.TimeAMString := resultSet.Columns[LOCALE_TIME_AM_STRING_C].AsString;
  390.   locale.TimePMString := resultSet.Columns[LOCALE_TIME_PM_STRING_C].AsString;
  391.   locale.TimeLeadingZeros := resultSet.Columns[LOCALE_TIME_LEADING_ZEROS_C].AsInteger = 1;
  392.   locale.TimeFormat := TIvTimeFormat(resultSet.Columns[LOCALE_TIME_FORMAT_C].AsInteger);
  393.   locale.TimeMarkPosition := TIvTimeMarkPosition(resultSet.Columns[LOCALE_TIME_MARK_POSITION_C].AsInteger);
  394.  
  395.   locale.CalendarType := TIvCalendarType(resultSet.Columns[LOCALE_CALENDAR_TYPE_C].AsInteger);
  396.   locale.OptionalCalendarType := TIvCalendarType(resultSet.Columns[LOCALE_OPTIONAL_CALENDAR_TYPE_C].AsInteger);
  397.   locale.FirstDayOfWeek := TIvDayOfWeek(resultSet.Columns[LOCALE_FIRST_DAY_OF_WEEK_C].AsInteger);
  398.   locale.FirstWeekOfYear := TIvFirstWeekOfYear(resultSet.Columns[LOCALE_FIRST_WEEK_OF_YEAR_C].AsInteger);
  399.  
  400.   for i := 1 to 12 do
  401.   begin
  402.     locale.ShortMonthNames[i] := resultSet.Columns[LOCALE_SHORT_MONTH1_C + i - 1].AsString;
  403.     locale.LongMonthNames[i] := resultSet.Columns[LOCALE_LONG_MONTH1_C + i - 1].AsString;
  404.   end;
  405.  
  406.   for i := 1 to 7 do
  407.   begin
  408.     locale.ShortDayNames[i] := resultSet.Columns[LOCALE_SHORT_DAY1_C + i - 1].AsString;
  409.     locale.LongDayNames[i] := resultSet.Columns[LOCALE_LONG_DAY1_C + i - 1].AsString;
  410.   end;
  411.  
  412.   locale.Init;
  413. end;
  414.  
  415. end.
  416.  
  417.